#include <iostream>
using namespace std;

/*恶汉模式的单例模式：以空间换时间*/
// 一个类只能实例化一个对象，让这个对象在类里面进行实例化操作

/*class Singleton
{
private:
    static Singleton _eton;//对象的声明
    //构造函数私有化，保证在类外无法实例化对象了 
    Singleton():_data(99)
    {
        cout<<"Singleton object created"<<endl;
    }
    Singleton(const Singleton&)=delete;//禁用拷贝构造函数
    ~Singleton(){}
private:
    int _data;
public:
    static Singleton& getInstance()//全局的访问接口
    {
        return _eton;
    }
    int GetData(){return _data;}
};

Singleton Singleton::_eton; //对象的定义还得在类外进行

//上面就是实现了恶汉模式的单例模式，但是这种模式在多线程环境下会有问题，因为在多线程环境下，如果多个线程同时调用getInstance()函数，就会造成多个对象被创建，这就违背了单例模式的原则。
*/

/*懒汉模式的单例模式，延迟加载的思想，一个对象到用的时候再去进行实例化*/

class Singleton
{
private:
    // 构造函数私有化，保证在类外无法实例化对象了
    Singleton() : _data(99)
    {
        cout << "Singleton object created" << endl;
    }
    Singleton(const Singleton &) = delete; // 禁用拷贝构造函数
    ~Singleton() {}
private:
    int _data;
public:
    //调用这个函数的时候就进行创建了一个对象
    static Singleton& getInstance()
    {
        static Singleton _eton; // 直接定义一个静态局部对象，只会在第一次调用getInstance()的时候实例化
        //以确保C++11起，静态变量将能够在满⾜ thread-safe 的前提下唯⼀地被构造和析构
        //如果多个线程同时舒适化同一个静态局部变量的话，则初始化只会发生一次
        return _eton;
    }
    
    int GetData(){return _data;}


};

int main()
{
    // cout<<Singleton::getInstance().GetData()<<endl;//将这个实例对象中的data进行输出操作了
    // Singleton::getInstance()就是一个对象了，getInstance返回的是一个对象
    return 0;
}